package com.zzyl.service.impl;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.zzyl.base.PageBean;
import com.zzyl.constant.WeChatConstants;
import com.zzyl.dto.UserLoginRequestDto;
import com.zzyl.entity.Member;
import com.zzyl.mapper.MemberMapper;
import com.zzyl.properties.JwtTokenProperties;
import com.zzyl.properties.WeChatProperties;
import com.zzyl.service.*;
import com.zzyl.utils.JwtUtil;
import com.zzyl.vo.*;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Slf4j
@Service
@RequiredArgsConstructor
public class MemberServiceImpl implements MemberService {

    private static final List<String> DEFAULT_NICKNAME_PREFIX =
            List.of("生活更美好", "大桔大利", "日富一日", "好柿开花", "柿柿如意", "一椰暴富", "大柚所为", "杨梅吐气", "天生荔枝");


    @Autowired
    private MemberMapper memberMapper;
    @Autowired
    private ContractService contractService;
    @Autowired
    private MemberElderService memberElderService;
    @Autowired
    private OrderService orderService;
    @Autowired
    WeChatProperties weChatProperties;
    @Autowired
    JwtTokenProperties jwtTokenProperties;
    @Autowired
    WechatService wechatService;


    /**
     * 根据id查询用户
     *
     * @param id 用户id
     * @return 用户信息
     */
    @Override
    public Member getById(Long id) {
        return memberMapper.selectById(id);
    }

    /**
     * 分页查询用户列表
     *
     * @param page     当前页码
     * @param pageSize 每页数量
     * @param phone    手机号
     * @param nickname 昵称
     * @return 分页结果
     */
    @Override
    public PageBean<MemberVo>page(Integer page, Integer pageSize, String phone, String nickname) {
        PageHelper.startPage(page, pageSize);
        Page<Member> listPage = memberMapper.page(phone, nickname);

        PageBean<MemberVo> pageBean = PageBean.of(listPage, MemberVo.class);

        pageBean.getRecords().forEach(memberVo -> {
            List<ContractVo> contractVos = contractService.listByMemberPhone(memberVo.getPhone());
            memberVo.setIsSign(contractVos.isEmpty() ? "否" : "是");
            List<OrderVo> orderVos = orderService.listByMemberId(memberVo.getId());
            memberVo.setOrderCount(orderVos.size());
            List<MemberElderVo> memberElderVos = memberElderService.listByMemberId(memberVo.getId());
            List<String> collect = memberElderVos.stream().map(m -> m.getElderVo().getName()).collect(Collectors.toList());
            memberVo.setElderNames(String.join(",", collect));
        });
        return pageBean;
    }

    /**
     * 微信登录
     *
     * @param dto
     */
    @Override
    public WxLoginVo wxLogin(UserLoginRequestDto dto) {
        //1.根据dto中的code，去调查微信小程序的登录接口，获取openid和session_key，用HuTool的HttpUtil工具类
       /* Map<String, Object> requestUrlParam = new HashMap<>();        //请求参数
        requestUrlParam.put("appid", weChatProperties.getAppid());    //小程序的appid
        requestUrlParam.put("secret", weChatProperties.getSecret());  //小程序的app secret
        requestUrlParam.put("js_code", dto.getCode());    //小程序调用wx.login返回的code
        requestUrlParam.put("grant_type", "authorization_code");  //默认参数
        String result = HttpUtil.get(WeChatConstants.WX_LOGIN_URL, requestUrlParam); //发送get请求
        */


        String openid = wechatService.getOpenid(dto.getCode());

        //获取手机号
        String phone = wechatService.getPhone(dto.getPhoneCode());

        //2.判断member表中是否有该用户的openId，其实就是根据openId查询用户，只能查到一个用户
        Member member = memberMapper.selectByOpenId(openid);

        //3.查到了，就不用管了，查不到，就插入一条用户数据（主键自增返回）
        if(ObjectUtil.isEmpty(member)){
            //4.随机生成一个昵称，插入到用户表中
            String nikeName = RandomUtil.randomEle(DEFAULT_NICKNAME_PREFIX) + RandomUtil.randomNumbers(4);
            member = new Member();
            member.setName(nikeName);
            member.setPhone(phone);
            member.setOpenId(openid);
            memberMapper.save(member);

        }

        //5.根据id生成jwt
        Map<String, Object> map1 = new HashMap<>();
        map1.put("id", member.getId());
        String jwt = JwtUtil.createJWT(jwtTokenProperties.getSecretKey(), jwtTokenProperties.getTtl(), map1);

        return WxLoginVo.builder().nickName(member.getName()).token(jwt).build();
    }
}
